<?php

class SiteDBHelper extends BaseSiteDBHelper {

	/**
	 * Visszaadja az összes nyelvkódot, ami a rendszerben van - site-ra való tekintet nélkül
	 *
	 * @return array a nyelvkódok vagy null ha hiba történt
	 */
	public static function getAllLanguageCodesInTheSystem() {
		$db = DBHandler::dbGet();

		$sql = "select distinct langcode from language order by langcode";
		$result =& $db->getAll($sql);

		if(PEAR::isError($result)) {
			$msg = "failed to get system-wide language codes from db: ".$result->getDebugInfo();
			Log::error($msg);
			MailHelper::sendAdminMail("db error occured", $msg);

			return null;
		}

		return DBUtil::getColumnAsArray($result, "langcode");
	}

	/**
	 * Visszaadja a dobozok listáját.
	 *
	 * @param string $langcode nyelv kód
	 * @param string $orderBy rendezés
	 * @param string $limit ennyi rekordot adjon vissza. ha nincs megadva, akkor
	 * @param string $columnNames mezők nevei. ha nincs megadva, akkor minden mező.
	 * @return unknown_type
	 */
	public static function &getBoxes($langcode = null, $orderBy = null, $limit = null, $columnNames = null) {

		$filter = new DBQueryFilter();
		$filter->addComponent("site_id", DBQueryFilter::OP_EQUALS, SiteHandler::getCurrentSiteId());

		if(!is_null($langcode))
		$filter->addComponent("langcode", DBQueryFilter::OP_EQUALS, $langcode);

		if(is_null($orderBy))
		$orderBy = array("serial asc");

		$result =& GeneralDBHelper::getTableRowsFiltered('box', $filter, $orderBy, $limit, $columnNames);
		return $result;
	}



	/**
	 * Visszaadja a doboz füleket listáját.
	 *
	 * @param string $boxId doboz azonosítója
	 * @return array
	 */
	public static function &getBoxTabs($boxId) {
		$data = array("box_id" => $boxId);
		return GeneralDBHelper::getTableRowsFiltered("box_tab", $data, array("serial asc"));
	}


	/**
	 * Visszaadja a megadott doboz fül tartalom listáit.
	 *
	 * @param string $boxTabId doboz fül azonosítója
	 * @return array
	 */
	public static function &getBoxContentLists($boxTabId) {
		$data = array("box_tab_id" => $boxTabId);
		$records =& GeneralDBHelper::getTableRowsFiltered("box_content_list", $data);
		for ($i = 0; $i < count($records); $i++) {
			$rec = $records[$i];

			$rec['box_article_ids'] = unserialize($rec['box_article_ids']);
			if ($rec['type'] == BOXCONTENTLIST_TYPE_FIXED) {
				$rec['sizemin'] = null;
				$rec['sizemax'] = null;
			}
			// üres string-et mint integert nem adhatunk vissza basszus!
			if(empty($rec['sizemin']))
			$rec['sizemin'] = null;
			if(empty($rec['sizemax']))
			$rec['sizemax'] = null;
			if(empty($rec['autostep']))
			$rec['autostep'] = null;
			if(empty($rec['attributes']))
			$rec['attributes'] = null;

			$records[$i] = $rec;
		}
		return $records;
	}


	/**
	 * article_boxcontentlist_connect rekordok visszaadása db-ből
	 *
	 * @param int $articleId melyik article?
	 * @param string $langcode melyik nyelven?
	 * @return array a rekordok vagy null ha hiba történt
	 */
	public static function getArticleBoxContentListOverrides($articleId, $langcode) {

		$db = DBHandler::dbGet();

		$sql = "select box_content_list_id from article_boxcontentlist_connect where article_id=? and langcode=?";
		$result =& $db->getAll($sql, array($articleId, $langcode));

		if(PEAR::isError($result))
		{
			$msg = "failed to get article_boxcontentlist_connect records from db: ".$result->getDebugInfo();
			Log::error($msg);
			MailHelper::sendAdminMail("db error occured", $msg);

			return null;
		}

		$result = DBUtil::getColumnAsArray($result, "box_content_list_id");
		return $result;
	}

	/********************************************************************************
	 * PROJEKT SPECIFIKUS részek
	********************************************************************************/

	/**
	 * Új regisztrált felhasználó hozzáadása.
	 *
	 * @param array $values Regisztrációs adatok.
	 */
	public static function addSiteUser($values) {
		unset($values['passwordconfirm']);
		unset($values['acceptTerms']);
		$values['created_at'] = date('Y-m-d H:i:s');
		$values['language'] = TextHandler::getCurrentLangcode();
		$values['site_id'] = SiteHandler::getCurrentSiteId();
		$values['rights'] = 0;
		return GeneralDBHelper::addTableRow('siteuser', $values);
	}

	/**
	 * Regisztrált felhasználó konfirmálása.
	 *
	 * @param string $regId Regisztrációs kulcs.
	 */
	public static function confirmSiteUser($regId) {
		$filter = new DBQueryFilter();
		$filter->addComponent('reg_id', DBQueryFilter::OP_EQUALS, $regId);
		$filter->addComponent('status', DBQueryFilter::OP_EQUALS, USER_STATUS_UNCONFIRMED);
		$record = GeneralDBHelper::getTableRowFiltered('siteuser', $filter);
		if (is_null($record)) {
			return false;
		} else {
			$data = array(
				'id' => $record['id'],
				'reg_id' => null,
				'status' => USER_STATUS_ACTIVE
			);
			GeneralDBHelper::modTableRow('siteuser', $data);
			return $record;
		}
	}

	/**
	 * Visszaadja a versenyformát.
	 *
	 * @param int $id Versenyforma azonosítója.
	 * @param string $langcode Ennek a nyelvkódnak megfelelően.
	 * @param boolean $any Ha nincs fordítás a rekordhoz, akkor is visszaad értékeket, ha más nyelven van.
	 */
	public static function getTournamentType($id, $langcode, $any = false) {
		$filter = new DBQueryFilter();
		$filter->addComponent('id', DBQueryFilter::OP_EQUALS, $id);
		if (! $any) {
			$filter->addComponent('langcode', DBQueryFilter::OP_EQUALS, $langcode);
			return GeneralDBHelper::getTableRowFiltered('tournamenttype', $filter);
		} else {
			$all = GeneralDBHelper::getTableRowsFiltered('tournamenttype', $filter);
			$result = array();
			foreach ($all as $record) {
				$result[$record['langcode']] = $record;
			}
			if (isset($result[$langcode])) {
				return $result[$langcode];
			} else if (isset($result[TextHandler::getCurrentLangcode()])) {
				return $result[TextHandler::getCurrentLangcode()];
			} else if (count($result) > 0) {
				return $result[0];
			} else {
				$result = null;
				return $result;
			}
		}
	}

	/**
	 * Visszaadja az adott hónapban zajló (vagy lezajlott) versenyeket.
	 *
	 * @param int $year Ebben az évben.
	 * @param int $month És ebben a hónapban.
	 * @param string $langcode Ennek a nyelvkódnak megfelelően.
	 * @param boolean $all Minden versenyt visszaad, még akkor is, ha nincs hozzá fordítás.
	 */
	public static function getTournamentsByMonth($year, $month, $langcode, $all = true) {
		$dateFrom = mktime(0, 0, 0, $month, 1, $year);
		$dateTo = CalendarUtil::addDate($dateFrom, 0, 1, 0);
		$filter = new DBQueryFilter();
		$filter->addComponent('date_from', DBQueryFilter::OP_GREATER_EQUALS, date('Y-m-d', $dateFrom));
		$filter->addComponent('date_from', DBQueryFilter::OP_LOWER, date('Y-m-d', $dateTo));
		if (! $all) {
			$filter->addComponent('langcode', DBQueryFilter::OP_EQUALS, $langcode);
			return GeneralDBHelper::getTableRowsFiltered('vw_tournament', $filter, array('name asc'));
		} else {
			$all = GeneralDBHelper::getTableRowsFiltered('vw_tournament', $filter, array('id asc'));
			$result = array();
			foreach ($all as $record) {
				$found = ($record['langcode'] == $langcode);
				if (! $found) $found = ! isset($result[$record['id']]);
				if (! $found) $found = ($result[$record['id']]['langcode'] != $langcode && $record['langcode'] = TextHandler::getCurrentLangcode());
				if ($found) $result[$record['id']] = $record;
			}
			return $result;
		}
	}

	/**
	 * Visszaadja az lezajlott versenyeket.
	 *
	 * @param string $langcode Ennek a nyelvkódnak megfelelően (de mindenképp ad valamit minden versenyhez).
	 */
	public static function getTournaments($langcode, $justFinished = true) {
		$filter = new DBQueryFilter();
		if ($justFinished) $filter->addComponent('date_from', DBQueryFilter::OP_LOWER, date('Y-m-d'));
		$all = GeneralDBHelper::getTableRowsFiltered('vw_tournament', $filter, array('date_from desc'));
		$result = array();
		foreach ($all as $record) {
			$found = ($record['langcode'] == $langcode);
			if (! $found) $found = ! isset($result[$record['id']]);
			if (! $found) $found = ($result[$record['id']]['langcode'] != $langcode && $record['langcode'] = TextHandler::getCurrentLangcode());
			if ($found) $result[$record['id']] = $record;
		}
		return $result;
	}

	/**
	 * Visszaadja a versenyt.
	 *
	 * @param int $id Verseny azonosítója.
	 * @param string $langcode Ennek a nyelvkódnak megfelelően.
	 * @param boolean $any Ha nincs fordítás a rekordhoz, akkor is visszaad értékeket, ha más nyelven van.
	 */
	public static function getTournament($id, $langcode, $any = false) {
		$filter = new DBQueryFilter();
		$filter->addComponent('id', DBQueryFilter::OP_EQUALS, $id);
		if (! $any) {
			$filter->addComponent('langcode', DBQueryFilter::OP_EQUALS, $langcode);
			return GeneralDBHelper::getTableRowFiltered('vw_tournament', $filter);
		} else {
			$all = GeneralDBHelper::getTableRowsFiltered('vw_tournament', $filter);
			$result = array();
			foreach ($all as $record) {
				$result[$record['langcode']] = $record;
			}
			if (isset($result[$langcode])) {
				return $result[$langcode];
			} else if (isset($result[AdminBase::getCurrentEditlang()])) {
				return $result[AdminBase::getCurrentEditlang()];
			} else if (isset($result[AdminBase::getDefaultEditlang()])) {
				return $result[AdminBase::getDefaultEditlang()];
			} else if (count($result) > 0) {
				return array_pop($result);
			} else {
				$result = null;
				return $result;
			}
		}
	}

	/**
	 * Visszaadja a versenyhez tartozó cikkeket.
	 *
	 * @param int $id Verseny azonosítója.
	 * @param string $langcode Ennek a nyelvkódnak megfelelően.
	 * @param boolean $all Minden versenyt visszaad, még akkor is, ha nincs hozzá fordítás.
	 */
	public static function getTournamentArticles($id, $langcode, $all = true) {
		$filter = new DBQueryFilter();
		$filter->addComponent('id_tournament', DBQueryFilter::OP_EQUALS, $id);
		if (! $all) {
			$filter->addComponent('langcode', DBQueryFilter::OP_EQUALS, $langcode);
			return GeneralDBHelper::getTableRowsFiltered('vw_tournamentarticle', $filter, array('publishdate desc'));
		} else {
			$all = GeneralDBHelper::getTableRowsFiltered('vw_tournamentarticle', $filter, array('id asc'));
			$result = array();
			foreach ($all as $record) {
				$found = ($record['langcode'] == $langcode);
				if (! $found) $found = ! isset($result[$record['id']]);
				if (! $found) $found = ($result[$record['id']]['langcode'] != $langcode && $record['langcode'] = TextHandler::getCurrentLangcode());
				if ($found) $result[$record['id']] = $record;
			}
			return $result;
		}
	}

	/**
	 * Visszaadja a versenyhez tartozó default cikket a megadott nyelvi preferencia
	 * szerint.
	 *
	 * @param int $id Verseny azonosítója.
	 * @param array $languagePreferenceArray Ennek a nyelvkódnak preferenciának megfelelően.
	 */
	public static function getDefaultTournamentArticle($id, $languagePreferenceArray = null) {
		if (is_null($languagePreferenceArray)) {
			$languagePreferenceArray = array(TextHandler::getCurrentLangcode(), 'en');
		}
		$filter = new DBQueryFilter();
		$filter->addComponent('id_tournament', DBQueryFilter::OP_EQUALS, $id);
		$filter->addComponent('isdefault', DBQueryFilter::OP_EQUALS, 1);
		$all = GeneralDBHelper::getTableRowsFiltered('vw_tournamentarticle', $filter);
		$record = null;
		if (! empty($all)) {
			foreach ($languagePreferenceArray as $langcode) {
				foreach ($all as $record) {
					if ($record['langcode'] == $langcode) return $record;
				}
			}
		}
		return $record;
	}

	/**
	 * Megmondja, hogy melyik hónapokban van verseny.
	 *
	 * @return array A hónapok sorszám szerint, ahol true az érték, ott van verseny.
	 */
	public static function getTournamentMonths() {
		$filter = new DBQueryFilter();
		$filter->addComponent('date_from', DBQueryFilter::OP_GREATER, date('Y').'-01-01');
		$tournaments = GeneralDBHelper::getTableRowsFiltered('tournament', $filter, array('date_from asc'));
		$result = array();
		for ($i = 1; $i <= 12; $i++) {
			$result[$i] = false;
		}
		foreach ($tournaments as $tournament) {
			$ts = TextUtil::parseTimestampString($tournament['date_from'], '%Y-%m-%d %H:%M:%S');
			if ($ts) {
				$mon = intval(date('m', $ts));
				$result[$mon] = true;
			}
		}
		return $result;
	}

	/**
	 * Megadja egy versenyhez milyen versenyformák vannak hozzárendelve.
	 *
	 * @param int $tournamentId Verseny azonosítója.
	 */
	public static function getTournamentTypesOfTournament($tournamentId, $langcode = null) {
		$filter = new DBQueryFilter();
		$filter->addComponent('id_tournament', DBQueryFilter::OP_EQUALS, $tournamentId);
		$all = GeneralDBHelper::getTableRowsFiltered('vw_tournament_ttype', $filter, array('id asc'));
		$result = array();
		if (is_null($langcode)) $langcode = TextHandler::getCurrentLangcode();
		foreach ($all as $record) {
			$found = ($record['langcode'] == $langcode);
			if (! $found) $found = ! isset($result[$record['id']]);
			if (! $found) $found = ($result[$record['id']]['langcode'] != $langcode && $record['langcode'] = TextHandler::getCurrentLangcode());
			if ($found) $result[$record['id']] = $record;
		}
		return $result;
	}

	public static function registerPlayers($tournamentId, $tournamentType, $names, $emails, $remark, $properties) {
		$db = DBHandler::dbGetDBHandler();
		try {
			$db->beginTransaction();

			$data = array(
				'id_tournament' => $tournamentId,
				'id_tournamenttype' => $tournamentType,
				'comment' => $remark
			);
			if (UserHandler::hasUser()) {
				$data['id_siteuser'] = UserHandler::getLoginId();
			}
			$registrationId = GeneralDBHelper::addTableRowInTransaction($db->get(), 'registration', $data);

			$data = array(
				'id_registration' => $registrationId
			);
			for ($i = 0; $i < count($names); $i++) {
				if (! empty($names[$i])) {
					$data['name'] = $names[$i];
					if (! empty($emails[$i])) $data['email'] = $emails[$i];
					else $data['email'] = null;
					$data['properties'] = json_encode($properties[$i]);
					GeneralDBHelper::addTableRowInTransaction($db->get(), 'registration_player', $data);
				}
			}

			$db->commit();
		} catch (Exception $e) {
			try {
				$db->rollback();
			} catch (Exception $e) {
				Log::error('Unable to rollback after exception '.$e->getMessage());
			}
			throw $e;
		}
	}

	/**
	 * Visszaadja a versenyhez tartozó jelentkezéseket.
	 *
	 * @param int $id Verseny azonosítója.
	 */
	public static function getTournamentRegistrations($id, $needEmail = true) {
		$filter = new DBQueryFilter();
		$filter->addComponent('id_tournament', DBQueryFilter::OP_EQUALS, $id);
		$all = GeneralDBHelper::getTableRowsFiltered('vw_registration', $filter, array('id_tournamenttype asc', 'insdate asc', 'id asc'));
		$result = array();
		$currentRecord = null;
		foreach ($all as $record) {
			if (is_null($currentRecord) || $currentRecord['id'] != $record['id']) {
				if (! is_null($currentRecord)) {
					$result[] = $currentRecord;
				}
				$currentRecord = $record;
				$currentRecord['players'] = array();
				$currentRecord['emails'] = array();
				$currentRecord['langcodes'] = array();
			}
			$playerString = $record['name'];
			if (! empty($record['email']) && $needEmail) {
				$playerString .= ' ('.$record['email'].')';
				$currentRecord['emails'][$record['player_id']] = $record['email'];
			}
			$currentRecord['players'][$record['player_id']] = $playerString;
			if (! empty($record['properties'])) {
				$parsed = json_decode($record['properties'], true);
				if (! empty($parsed) && is_array($parsed) && $parsed['foreigner']) {
					$currentRecord['langcodes'][$record['player_id']] = 'en';
				}
			}
		}
		if (! is_null($currentRecord)) {
			$result[] = $currentRecord;
		}
		return $result;
	}

	/**
	 * Visszaadja az adott versenyhez és versenyformához tartozó partner keresőket.
	 * @param int $tournamentId Verseny azonosító.
	 * @param int $tournamentTypeId Versenyforma azonosító.
	 */
	public static function getPartnerFinderRegistrations($tournamentId, $tournamentTypeId) {
		$filter = new DBQueryFilter();
		$filter->addComponent("id_tournament", DBQueryFilter::OP_EQUALS, $tournamentId);
		$filter->addComponent("id_tournamenttype", DBQueryFilter::OP_EQUALS, $tournamentTypeId);

		$orderBy = array("id asc");

		$result =& GeneralDBHelper::getTableRowsFiltered('partnerfinder', $filter, $orderBy);
		return $result;
	}

	/**
	 * Visszaadja a partner kereső hirdetést..
	 * @param int $id Hirdetés azonosító.
	 */
	public static function getPartnerFinderRegistration($id) {
		return GeneralDBHelper::getTableRow('partnerfinder', $id);
	}

	/**
	 * Parterkereső hirdetés feladása.
	 *
	 * @param int $tournamentId Verseny id.
	 * @param int $tournamentTypeId Versenyforma id.
	 * @param array $data Tábla adatok.
	 */
	public static function registerPartnerFinder($tournamentId, $tournamentTypeId, $data) {
		$data['id_tournament'] = $tournamentId;
		$data['id_tournamenttype'] = $tournamentTypeId;
		return GeneralDBHelper::addTableRow('partnerfinder', $data);
	}

}
